package com.example.demokotlin

import org.junit.Test


/**
 * 延迟初始化测试
 * 在使用之前才进行初始化。
 *
 * @author zhouronghua
 * @time 2021/9/14 8:48 上午
 */
class lazyInitTest {

    class Player {
        lateinit var name: String

        fun ready() {
            name = "Jacky"
        }

        fun battle() {
            println("$name is battle")
        }

        /**
         * config属性采用惰性初始化
         * 惰性初始化并不是延迟初始化的唯一方式，你可以暂时不初始化某个变量，
         * 知道首次使用它，这个叫做惰性初始化
         *
         * @author zhouronghua
         * @time 2021/9/20 11:44 上午
         */
        val config:String by lazy {
            loadConfig()
        }

        /**
         * 加载配置信息
         *
         * @author zhouronghua
         * @time 2021/9/20 11:46 上午
         */
        private fun loadConfig(): String {
            println("start loading config...")
            return "config is initiated"
        }
    }

    /**
     * 延迟初始化的成员，在使用前必须进行初始化
     * 否则会发生异常
     * UninitializedPropertyAccessException
     *
     * @author zhouronghua
     * @time 2021/9/14 8:56 上午
     */
    @Test
    fun testFieldLateInit() {
        var p = Player()
        p.run {
            ready()
            // 必须先执行ready初始化成员name
            battle()
        }
    }

    /**
     * 测试属性惰性初始化
     *
     * @author zhouronghua
     * @time 2021/9/20 11:48 上午
     */
    @Test
    fun testLazy() {
        println("=== 测试属性惰性初始化 ===")
        var p = Player()
        // 只有访问config属性才进行初始化
        println(p.config)
    }
}